package org.example;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class BaseStringAndDate {
    //String 是不可变的:https://www.cnblogs.com/leskang/p/6110631.html
    //因为内部用 private final修饰的value(value 其实是可变的)
    //而且没提供修改的方法
    //substring 创建了一个新串
    public static void main(String[] args) throws ParseException{

        ThreeDate();

    }
    public static void ThreeDate() throws ParseException {
        //Date
        Date date=new Date();//不传参代表当前当前时刻,
        System.out.println(date);
        System.out.println(date.getTime());
        date=new Date(3600*24*365*40*1000L);
        System.out.println(date);

        //DateFormat-抽象类 SimpleDateFormat-子类
        //字符串和时间的转化
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
        //new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
        //字符串转换为Date对象
        simpleDateFormat.parse("2021-04-24");
        //Date对象转换为字符串
        date=new Date();
        String str=simpleDateFormat.format(date);
        System.out.println(str);
        //获取个别日期
        simpleDateFormat=new SimpleDateFormat("今年的第w周\t今年的第D天");
        System.out.println(simpleDateFormat.format(date));

        //Calendar-日期计算
        GregorianCalendar calendar=new GregorianCalendar();
        calendar.get(Calendar.YEAR);//Calendar.MONDAY ...
        calendar.set(Calendar.YEAR,2022);
        calendar.add(Calendar.MONTH,5);
        calendar.setTime(new Date());
        System.out.println(calendar.toString());
    }
    public static void JustString(){
        String a="aaa"; //在常量池中
        String b=new String("aaa");//在堆的对象地址中
        String c="aaa";
        System.out.println(a==b);
        System.out.println(a==c);
        String str1="hello"+" java";
        String str2="hello java";
        System.out.println(str1==str2);
        String str3="hello";
        String str4=" java";
        String str5=str3+str4;
        System.out.println(str5==str2);
        /* 返回新的字符串对象 原字符串不变
         * length()
         * charAt()
         * equals()
         * indexOf("aa")//子串第一个索引  找不到-1 lastIndexOf 从后找
         * replace(old,new) 替换全部old串
         * startWith()/endWith()
         * substring(start,end)
         * trim()  删除头部尾部空白字符
         * */
    }
    public static void ThreeString(){
        //StringBuffer 效率低线程安全
        //StringBuilder 效率高 线程不安全
        StringBuffer buffer=new StringBuffer("aaaaaaa");
        buffer.append(111).append(222);//返回自己
        buffer.insert(5,"哈哈哈");
        System.out.println(buffer.toString());
        buffer.delete(2,5);
        buffer.deleteCharAt(3);
        System.out.println(buffer.toString());
        //会扩容!新对象!
        //禁用str+="11";   //加多少个 创建多少个对象
        //用buffer.append(11); 只有一个对象
        Runtime.getRuntime().freeMemory();
        System.currentTimeMillis();
    }
    public static void testReflection() throws Exception {

        //创建字符串"Hello World"， 并赋给引用s
        String s = "Hello World";

        System.out.println("s = " + s); //Hello World

        //获取String类中的value字段
        Field valueFieldOfString = String.class.getDeclaredField("value");

        //改变value属性的访问权限
        valueFieldOfString.setAccessible(true);

        //获取s对象上的value属性的值
        char[] value = (char[]) valueFieldOfString.get(s);

        //改变value所引用的数组中的第5个字符
        value[5] = '_';

        System.out.println("s = " + s);  //Hello_World
    }
}
